import hashlib
import random
import logging
import requests
import json

logging.basicConfig(filename="./log/bridge_change.log", filemode='w',
                    format='%(asctime)s : %(levelname)s : %(message)s',
                    level=logging.DEBUG)


class EnChange:
    def __init__(self, url, appid, secretkey, entext):
        self.api = url
        self.appid = appid
        self.secretKey = secretkey
        self.entext = entext
        self.httpClient = None
        self.fromLang = 'en'
        self.toLang = 'zh'
        self.salt = random.randint(32768, 65536)
        self.sign = self.appid + self.entext + str(self.salt) + self.secretKey
        m1 = hashlib.md5()
        m1.update(self.sign.encode(encoding='utf-8'))
        self.sign = m1.hexdigest()

    def request_api(self):
        """
        请求api
        先去判断下是否为单个词，数据库中，是否已经有，满足，就直接返回数据库中的翻译
        不满足，就去掉翻译接口，返回翻译结果
        :return:
        """
        sectext = self._sec_local_db()  # 判断一下是否数据库中存在， 存在，则用数据库中的值
        if sectext:
            logging.info("数据库中存在 {} 翻译为 {}".format(self.entext, sectext))
            return sectext
        else:
            return self._translator_to_zh()


    def _translator_to_zh(self):
        """
        调翻译接口
        先调接口，完成翻译，返回
        然后，再判断是否单个词，满足，把数据写入数据库
        :return:
        """
        url = "http://api.fanyi.baidu.com" + self.api
        parms = {"appid": self.appid, "q": self.entext, "from": self.fromLang, "to": self.toLang,
                 "salt": self.salt, "sign": self.sign}
        logging.info("====请求地址为====: {}".format(url))
        logging.info("====请求参数为====：{}".format(parms))
        zhtext = []
        try:
            rsp = requests.get(url, params=parms)
            logging.info(rsp.text)
            chtext = json.loads(rsp.text)
            logging.info(chtext['trans_result'])
            for t in range(len(chtext['trans_result'])):
                zhtext.append(chtext['trans_result'][t]['dst'])
            return "\n".join(zhtext)
        except BaseException as e:
            logging.error(e)
            return e
        finally:
            # 如果是 单个单词， 则写入数据库
            if len(self.entext.split()) == 1:
                self.op.insert_data(self.entext, zhtext[0])

    def _sec_local_db(self):
        """
        查询本地数据库中数据
        如果为单个词，查询下数据库中是否存在，存在，就返回数据库中的翻译的值
        :return:
        """
        if len(self.entext.split(' ')) == 1:
            try:
                from bridge.dbinfo import OperateSql
                self.op = OperateSql()
                sec_zh = self.op.select_key(self.entext)
                return sec_zh[0][0] if sec_zh[0][0] else False
            except BaseException as e:
                logging.error(e)
                return False
        else:
            return False